/**
 * 币安交易对状态监控测试脚本
 * 测试状态监控功能是否正常工作
 */

const path = require('path');
const fs = require('fs');

// 设置工作目录到项目根目录
const projectRoot = path.join(__dirname, '..');
process.chdir(projectRoot);

const logger = require(path.join(projectRoot, 'src/utils/logger'));
const StatusMonitor = require(path.join(projectRoot, 'src/monitors/statusMonitor'));
const BinanceStatusService = require(path.join(projectRoot, 'src/services/binanceStatusService'));

async function testStatusMonitor() {
  console.log('🧪 开始测试币安交易对状态监控功能...\n');

  try {
    // 测试1: 检查StatusMonitor类加载
    console.log('📋 测试1: 检查StatusMonitor类加载...');
    const statusMonitor = new StatusMonitor();
    console.log('✅ StatusMonitor类加载成功');

    // 测试2: 检查BinanceStatusService加载
    console.log('\n📋 测试2: 检查BinanceStatusService加载...');
    const statusService = new BinanceStatusService();
    console.log('✅ BinanceStatusService类加载成功');

    // 测试3: 检查API连接
    console.log('\n📋 测试3: 检查币安API连接状态...');
    try {
      const isConnected = await statusService.checkConnection();
      console.log(`✅ API连接检查完成，状态: ${isConnected ? '正常' : '异常'}`);
    } catch (error) {
      console.log(`⚠️  API连接检查失败: ${error.message}`);
      console.log('💡 这可能是因为：');
      console.log('   - 网络连接问题');
      console.log('   - API服务暂时不可用');
      console.log('   - 防火墙或代理设置');
    }

    // 测试4: 获取交易对状态数据
    console.log('\n📋 测试4: 获取USDT交易对状态数据...');
    try {
      const symbols = await statusService.fetchAllSymbolStatus();
      console.log(`✅ 成功获取 ${symbols.length} 个USDT交易对状态`);
      
      if (symbols.length > 0) {
        // 显示状态统计
        const stats = statusService.generateStatusStats(symbols);
        console.log(`   📊 状态统计:`);
        console.log(`      总计: ${stats.total}`);
        console.log(`      现货: ${stats.byType.SPOT || 0}`);
        console.log(`      期货: ${stats.byType.FUTURES || 0}`);
        console.log(`      TRADING: ${stats.byStatus.TRADING || 0}`);
        console.log(`      BREAK: ${stats.byStatus.BREAK || 0}`);
        console.log(`      其他状态: ${stats.total - (stats.byStatus.TRADING || 0) - (stats.byStatus.BREAK || 0)}`);
        
        // 显示前几个示例
        console.log(`   📝 前5个交易对示例:`);
        symbols.slice(0, 5).forEach((symbol, index) => {
          console.log(`      ${index + 1}. ${symbol.type} ${symbol.symbol}: ${symbol.status}`);
        });
      }
    } catch (error) {
      console.log(`❌ 获取交易对状态失败: ${error.message}`);
    }

    // 测试5: 测试状态变化检查
    console.log('\n📋 测试5: 测试状态变化检查逻辑...');
    try {
      // 第一次检查，建立基线
      await statusService.performStatusCheck();
      console.log('✅ 基线状态检查完成');
      
      // 模拟第二次检查（通常不会有变化）
      const result = await statusService.performStatusCheck();
      console.log(`✅ 状态变化检查完成，发现 ${result.alerts ? result.alerts.length : 0} 个变化`);
    } catch (error) {
      console.log(`❌ 状态变化检查失败: ${error.message}`);
    }

    // 测试6: 测试监控器初始化
    console.log('\n📋 测试6: 测试监控器初始化...');
    try {
      await statusMonitor.initialize();
      console.log('✅ 监控器初始化成功');
      
      const status = statusMonitor.getStatus();
      console.log(`   监控器状态:`);
      console.log(`      名称: ${status.name}`);
      console.log(`      描述: ${status.description}`);
      console.log(`      检查间隔: ${status.checkInterval}`);
      console.log(`      邮件配置: ${status.emailConfigured ? '已配置' : '未配置'}`);
    } catch (error) {
      console.log(`❌ 监控器初始化失败: ${error.message}`);
    }

    // 测试7: 手动触发检查
    console.log('\n📋 测试7: 手动触发状态检查...');
    try {
      const result = await statusMonitor.triggerCheck();
      console.log('✅ 手动状态检查完成');
      console.log(`   结果: ${result.success ? '成功' : '失败'}`);
      console.log(`   消息: ${result.message || 'N/A'}`);
      console.log(`   监控交易对: ${result.symbolCount || 0} 个`);
      console.log(`   发现告警: ${result.alerts ? result.alerts.length : 0} 个`);
    } catch (error) {
      console.log(`❌ 手动状态检查失败: ${error.message}`);
    }

    // 测试8: 环境变量配置检查
    console.log('\n📋 测试8: 检查环境变量配置...');
    const enableStatusMonitor = process.env.ENABLE_STATUS_MONITOR !== 'false';
    const statusCheckInterval = parseInt(process.env.STATUS_CHECK_INTERVAL) || 300000;
    
    console.log(`✅ 状态监控环境变量:`);
    console.log(`   ENABLE_STATUS_MONITOR: ${process.env.ENABLE_STATUS_MONITOR || 'undefined'} (解析为: ${enableStatusMonitor})`);
    console.log(`   STATUS_CHECK_INTERVAL: ${process.env.STATUS_CHECK_INTERVAL || 'undefined'} (解析为: ${statusCheckInterval}ms)`);

    console.log('\n🎉 币安交易对状态监控功能测试完成!');
    
    // 显示使用建议
    console.log('\n💡 使用建议：');
    console.log('   - 在生产环境启用: ENABLE_STATUS_MONITOR=true');
    console.log('   - 设置合适的检查间隔: STATUS_CHECK_INTERVAL=300000 (5分钟)');
    console.log('   - 确保邮件服务已配置以接收告警');
    console.log('   - 关注TRADING→BREAK状态变化，这是关键告警');
    console.log('   - 定期检查日志文件了解监控状态');
    
    console.log('\n📊 功能特点：');
    console.log('   - 同时监控现货和期货市场');
    console.log('   - 专注USDT交易对状态变化');
    console.log('   - 智能告警分级（CRITICAL vs INFO）');
    console.log('   - 完整的邮件通知模板');
    console.log('   - 详细的监控日志记录');

  } catch (error) {
    console.log(`\n❌ 测试过程中发生错误: ${error.message}`);
    console.log('\n🔧 故障排除建议：');
    console.log('   1. 检查网络连接和防火墙设置');
    console.log('   2. 确认币安API服务可用性');
    console.log('   3. 检查环境变量配置');
    console.log('   4. 验证邮件服务配置');
    console.log('   5. 查看详细错误日志');
    
    process.exit(1);
  }
}

// 运行测试
testStatusMonitor().then(() => {
  console.log('\n👋 测试脚本执行完成');
}).catch(error => {
  console.log(`\n❌ 测试脚本执行失败: ${error.message}`);
  process.exit(1);
});
